409. 最长回文串
409. 最长回文串
Similar Question
Solution Tips
方案一: 贪心算法
回文串是一个正读和反读都一样的字符串。对一个左边的字符 i 右边一定会有一个对称 i。比如 'abcba', 'aa','bb' 这几个回文串。其中第一个有点特殊,中间的 c 是唯一的。
对于每个字母,假设它出现了 v 次。我们可以让 v \ 2 * 2
个字母左右对称。例如,对于字符串 'aaaaa',其中 'aaaa' 是左右对称,其长度为 5 \ 2 * 2 = 4
。
最后,如果有任何一个满足 v % 2 == 1 的 v,那么这个字符就可能是回文串中唯一的那个中心。针对这种情况,我们需要判断 v % 2 == 1 && ans % 2 == 0,后面的判断主要是为了防止重复计算。
实现
var longestPalindrome = function(s) {
const len = s.length
const map = {}
let ans = 0
for (let i = 0; i < len; i++) {
if(map[s[i]]===undefined){
map[s[i]] = 1
}else{
map[s[i]]++
}
}
for (const count of Object.values(map)) {
ans += (count>>>1)*2
// 中心只能选择一次,之后ans % 2 !== 0, 相当于是只选择了最先遇到的奇数字符为中心
if (count % 2 == 1 && ans % 2 == 0) ans++
}
return ans
}
console.log(longestPalindrome('aabbbccc'))